// 导入必要的Java Swing和AWT库
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// ShapeDrawerGUI类继承自JFrame，用于创建图形用户界面
public class ShapeDrawer extends JFrame {
    // 定义一个DrawArea对象，用作绘图的主要区域
    private DrawArea drawArea = new DrawArea();
    // ShapeDrawerGUI的构造函数
    public ShapeDrawer() {
        this.setSize(400, 400); // 设置窗口的初始大小
// 设置默认关闭操作，退出程序 
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("图形绘制器"); // 设置窗口标题
// 将绘图区域添加到窗口的中央this.add(drawArea, BorderLayout.CENTER);
// 创建一个下拉列表（JComboBox），用于选择要绘制的图形类型 
        JComboBox<String> shapeSelector = new JComboBox<>(new String[]{"正方 形", "长方形", "圆形", "三角形"});
// 将下拉列表添加到窗口的北部（上方） 
                this.add(shapeSelector, BorderLayout.NORTH);
// 为下拉列表添加事件监听器，以便在用户选择不同选项时做出响应 
        shapeSelector.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                public void actionPerformed(ActionEvent e) {
                    JComboBox cb = (JComboBox) e.getSource();
                    String shapeName = (String) cb.getSelectedItem();
                    int size = 0; // 初始化尺寸变量
                    boolean validInput = false; // 标记用户输入是否有效
                    while (!validInput) { // 循环直到用户输入有效
                        String input = JOptionPane.showInputDialog("请输入" + shapeName + "的 尺寸:");
                        try {
                            size = Integer.parseInt(input); // 尝试将输入转换为整数
                            validInput = true; // 如果成功转换，标记输入有效并退出循环
                        }
                        catch (NumberFormatException ex) {
                            JOptionPane.showMessageDialog(null, "输入无效，请输入一个整数。");
// 如果失败，提示用户重新输入
                        }
                    }
                    drawArea.setShape(shapeName, size); // 更新图形和尺寸

                String input = JOptionPane.showInputDialog("请输入" + shapeName +
                        "的尺寸:");

                size = Integer.parseInt(input); // 将输入转换为整drawArea.setShape(shapeName, size); // 更新图形和尺寸
// 获取用户选择的项JComboBox cb = (JComboBox) e.getSource();String shapeName = (String) cb.getSelectedItem();
// 根据选择更新绘图区域的当前图形，并重绘drawArea.setShape(shapeName);
            }
        };

// 主方法，程序的入口点 
        public static void main(String[] args) {
// 使用SwingUtilities.invokeLater 
// 来确保GUI的创建和更新在事件派发线程上执行 
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
// 创建ShapeDrawer对象，并使窗口可见 
                    new ShapeDrawer().setVisible(true);}
        });
}
// DrawArea类继承自JPanel，用于自定义绘图逻辑private static class DrawArea extends JPanel {
    private String shape = "正方形";
    private int size = 100; // 添加尺寸属性，默认为100
    public void setShape(String shape, int size) {
        this.shape = shape;
        this.size = size;
        this.repaint(); // 请求重新绘制面板
    }
// 其他代码无改变...


    // 默认绘制的图形是正方形private String shape = "正方形";
    // setShape方法用于更新当前要绘制的图形
    public void setShape(String shape) {
        this.shape = shape;
        this.repaint(); // 调用repaint方法来重绘面板
    }

// 重写paintComponent方法以实现自定义绘图逻辑
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        switch (shape) {
            case "正方形":
                g.drawRect(50, 50, size, size); break;
            case "长方形":
                g.drawRect(50, 50, size * 2, size);
                break;
            case "圆形":
                g.drawOval(50, 50, size, size);
                break;
            case "三角形":
                int[] xPoints = {50 + size / 2, 50, 50 + size};
                int[] yPoints = {50, 50 + size, 50 + size};
                g.drawPolygon(xPoints, yPoints, 3);
                break;
        }



// 调用父类的paintComponent方法进行默认的绘图操作super.paintComponent(g);
// 根据当前选择的图形，使用switch语句绘制相应的图形
        switch (shape) {
            case "正方形":
// 绘制正方形
                g.drawRect(50, 50, 100, 100);
                break;
            case "长方形":
// 绘制长方形
                g.drawRect(50, 50, 150, 100);
                break;
            case "圆形":
// 绘制圆形
                g.drawOval(50, 50, 100, 100);
                break;
            case "三角形":
// 绘制三角形，需要定义顶点坐标
                int[] xPoints = {100, 50, 150};
                int[] yPoints = {50, 150, 150};
// 使用drawPolygon方法绘制多边形，这里是三角形
                g.drawPolygon(xPoints, yPoints, 3);
                break;
            default:
                break;
        }
    }}

